package installer

import (
	"fmt"
	"strings"

	"go.uber.org/zap"
)

// Installer 安装器
// 示例值: installDir="/usr/local/openssh"
type Installer struct {
	installDir string
}

// NewInstaller 创建安装器
// 示例值: installDir="/usr/local/openssh"
func NewInstaller(installDir string) *Installer {
	return &Installer{
		installDir: installDir,
	}
}

// InstallOpenSSH 安装OpenSSH
// 示例值: tarPath="/tmp/ssh-upgrade/openssh-9.7p1.tar.gz"
func (i *Installer) InstallOpenSSH(tarPath string) error {
	zap.L().Info("开始安装OpenSSH")

	// 验证tar文件
	if !strings.HasSuffix(tarPath, ".tar.gz") {
		return fmt.Errorf("文件格式错误，必须是.tar.gz文件")
	}

	// 检查依赖
	if err := i.checkDependencies(); err != nil {
		zap.L().Warn("依赖检查失败", zap.Error(err))
		return err
	}

	// 停止SSH服务
	if err := i.stopSSHService(); err != nil {
		zap.L().Warn("停止SSH服务失败", zap.Error(err))
		return err
	}

	// 解压源码包
	extractDir, err := i.extractTarFile(tarPath)
	if err != nil {
		return fmt.Errorf("解压源码包失败: %v", err)
	}

	// 编译安装
	if err := i.compileAndInstall(extractDir); err != nil {
		return fmt.Errorf("编译安装失败: %v", err)
	}

	// 启动SSH服务
	if err := i.startSSHService(); err != nil {
		return fmt.Errorf("启动SSH服务失败: %v", err)
	}

	zap.L().Info("OpenSSH安装完成")
	return nil
}

// Cleanup 清理临时文件
// 示例值: 无参数
func (i *Installer) Cleanup() error {
	zap.L().Info("清理临时文件")
	// 由于移除了备份功能，这里返回nil
	return nil
}

// VerifyInstallation 验证安装结果
// 示例值: 无参数
func (i *Installer) VerifyInstallation() error {
	zap.L().Info("验证OpenSSH安装结果")
	return verifyInstallation(i.installDir)
}